package net.jgrm.redisadvanced.lock;

import java.util.concurrent.TimeUnit;

/**
 * Redis分布式锁服务接口
 * 提供基于Redis的分布式锁操作
 */
public interface RedisLockService {

    /**
     * 获取锁
     *
     * @param lockKey 锁的键名
     * @return 是否获取成功
     */
    boolean lock(String lockKey);

    /**
     * 获取锁，带过期时间
     *
     * @param lockKey    锁的键名
     * @param expireTime 过期时间
     * @param timeUnit   时间单位
     * @return 是否获取成功
     */
    boolean lock(String lockKey, long expireTime, TimeUnit timeUnit);

    /**
     * 尝试获取锁，如果获取不到则等待
     *
     * @param lockKey   锁的键名
     * @param waitTime  等待时间
     * @param leaseTime 过期时间
     * @param timeUnit  时间单位
     * @return 是否获取成功
     */
    boolean tryLock(String lockKey, long waitTime, long leaseTime, TimeUnit timeUnit) throws InterruptedException;


    boolean tryLock(String lockKey, long waitTime, TimeUnit timeUnit) throws InterruptedException;

    /**
     * 释放锁
     *
     * @param lockKey 锁的键名
     * @return 是否释放成功
     */
    boolean unlock(String lockKey);

    /**
     * 检查锁是否被占用
     *
     * @param lockKey 锁的键名
     * @return 锁是否被占用
     */
    boolean isLocked(String lockKey);

    /**
     * 获取可重入锁
     *
     * @param lockKey 锁的键名
     * @return 是否获取成功
     */
    boolean lockReentrant(String lockKey);

    /**
     * 获取可重入锁，带过期时间
     *
     * @param lockKey    锁的键名
     * @param expireTime 过期时间
     * @param timeUnit   时间单位
     * @return 是否获取成功
     */
    boolean lockReentrant(String lockKey, long expireTime, TimeUnit timeUnit);

    /**
     * 尝试获取可重入锁
     *
     * @param lockKey    锁的键名
     * @param waitTime   等待时间
     * @param expireTime 过期时间
     * @param timeUnit   时间单位
     * @return 是否获取成功
     */
    boolean tryLockReentrant(String lockKey, long waitTime, long expireTime, TimeUnit timeUnit) throws InterruptedException;

    /**
     * 释放可重入锁
     *
     * @param lockKey 锁的键名
     * @return 是否释放成功
     */
    boolean unlockReentrant(String lockKey);

    /**
     * 获取公平锁
     *
     * @param lockKey 锁的键名
     * @return 是否获取成功
     */
    boolean lockFair(String lockKey);

    /**
     * 获取公平锁，带过期时间
     *
     * @param lockKey    锁的键名
     * @param expireTime 过期时间
     * @param timeUnit   时间单位
     * @return 是否获取成功
     */
    boolean lockFair(String lockKey, long expireTime, TimeUnit timeUnit);

    /**
     * 尝试获取公平锁
     *
     * @param lockKey    锁的键名
     * @param waitTime   等待时间
     * @param expireTime 过期时间
     * @param timeUnit   时间单位
     * @return 是否获取成功
     */
    boolean tryLockFair(String lockKey, long waitTime, long expireTime, TimeUnit timeUnit) throws InterruptedException;

    /**
     * 释放公平锁
     *
     * @param lockKey 锁的键名
     * @return 是否释放成功
     */
    boolean unlockFair(String lockKey);

    /**
     * 获取读写锁中的读锁
     *
     * @param lockKey 锁的键名
     * @return 是否获取成功
     */
    boolean lockRead(String lockKey);

    /**
     * 获取读写锁中的读锁，带过期时间
     *
     * @param lockKey    锁的键名
     * @param expireTime 过期时间
     * @param timeUnit   时间单位
     * @return 是否获取成功
     */
    boolean lockRead(String lockKey, long expireTime, TimeUnit timeUnit);

    /**
     * 尝试获取读写锁中的读锁
     *
     * @param lockKey    锁的键名
     * @param waitTime   等待时间
     * @param expireTime 过期时间
     * @param timeUnit   时间单位
     * @return 是否获取成功
     */
    boolean tryLockRead(String lockKey, long waitTime, long expireTime, TimeUnit timeUnit) throws InterruptedException;

    /**
     * 释放读写锁中的读锁
     *
     * @param lockKey 锁的键名
     * @return 是否释放成功
     */
    boolean unlockRead(String lockKey);

    /**
     * 获取读写锁中的写锁
     *
     * @param lockKey 锁的键名
     * @return 是否获取成功
     */
    boolean lockWrite(String lockKey);

    /**
     * 获取读写锁中的写锁，带过期时间
     *
     * @param lockKey    锁的键名
     * @param expireTime 过期时间
     * @param timeUnit   时间单位
     * @return 是否获取成功
     */
    boolean lockWrite(String lockKey, long expireTime, TimeUnit timeUnit);

    /**
     * 尝试获取读写锁中的写锁
     *
     * @param lockKey    锁的键名
     * @param waitTime   等待时间
     * @param expireTime 过期时间
     * @param timeUnit   时间单位
     * @return 是否获取成功
     */
    boolean tryLockWrite(String lockKey, long waitTime, long expireTime, TimeUnit timeUnit) throws InterruptedException;

    /**
     * 释放读写锁中的写锁
     *
     * @param lockKey 锁的键名
     * @return 是否释放成功
     */
    boolean unlockWrite(String lockKey);
}